package com.googlecode.maratische.google.model;

import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.SwingUtilities;

import org.apache.log4j.Logger;

import be.lechtitseb.google.reader.api.core.GoogleReader;
import be.lechtitseb.google.reader.api.model.exception.GoogleReaderException;
import be.lechtitseb.google.reader.api.model.feed.ItemDescriptor;
import be.lechtitseb.google.reader.api.util.GoogleReaderUtil;

import com.googlecode.maratische.google.BaseException;
import com.googlecode.maratische.google.DaoAction;
import com.googlecode.maratische.google.MainController;
import com.googlecode.maratische.google.dao.FeedDao;
import com.googlecode.maratische.google.dao.ItemDao;
import com.googlecode.maratische.google.dao.LabelDao;

public class CommandUpdateStarredItems extends CommandUpdateFeedOffline {

	static Logger logger = Logger.getLogger(CommandUpdateStarredItems.class.getName());

	@Override
	public boolean execute(DaoAction daoAction) throws BaseException, GoogleReaderException, SQLException {
		GoogleReader googleReader = getGoogleReader(daoAction);
		//получаем количество элементов и округляем до ближайшей сотни.
		int k = daoAction.getItemDao().countAllLabeled();
		k = (1 + k / 100)*100;
		//делим на 2, так как далее произойдет умножение на 2
		k = k/2;
		List<ItemDescriptor> items = null;
		do {
			k *= 2;
			String result = googleReader.getStarredItems(k);
			items = GoogleReaderUtil.getItemDescriptorsFromItemsXml(result);
		} while (items.size() == k && items.size() < 2000);
//		logger.info(items);
		List<Integer> existsLabelId = new ArrayList<Integer>();
		FeedDao feedDao = daoAction.getFeedDao(); 
		LabelDao labelDao = daoAction.getLabelDao();
		ItemDao itemDao = daoAction.getItemDao();
		for (ItemDescriptor itemDescription : items) {
//			logger.info(itemDescription);
			String feedXmlUrl = itemDescription.getSourceUri();
			if (feedXmlUrl != null) {
				if (feedXmlUrl.indexOf("tag:google.com,2005:reader/feed/")==0) {
					feedXmlUrl = feedXmlUrl.substring("tag:google.com,2005:reader/feed/".length());
//					logger.info(feedXmlUrl);
					List<Feed> feeds = feedDao.findByXMLUrl(feedXmlUrl);
					if (feeds != null && feeds.size()>0) {
						Feed feed = feeds.get(0);
						Item item = new Item(itemDescription);
						List<Item> list = itemDao.findByLink(item.getLink());
						if (list == null || list.size()==0) {
							item.setFeedId(feed.getId());
							item.setRead(true);
							item.setReadedDate(new Date(new java.util.Date().getTime()));
							item = daoAction.getItemDao().save(item);
//							existIds.add(item.getId());
							findMediaResource(item, daoAction);
						} else {
							item = list.get(0);
//							logger.info("Exist "+item.getTitle());
						}
						//вдруг самой метки нет, надо создать!
						if (item.getLabelId() == null) {
							Label label = new Label();
							label.setType(Label.LABEL_TYPE_READ);
							label = labelDao.save(label);
							item.setLabelId(label.getId());
							item = daoAction.getItemDao().save(item);
							existsLabelId.add(label.getId());
							//надо пометить для скачки свеже созданную метку
							CommandUpdateFullItem command2 = (CommandUpdateFullItem)Command.createCommand(Commands.UpdateFullItem);
							command2.setInteger1(item.getId());
							daoAction.getCommandDao().save(command2);
						} else {
							existsLabelId.add(item.getLabelId());
						}
					}
				}
			}
		}
		//удаляем не пришедшие метки, считаем их удаленными, 
		//делаем это самым сложным путем, вытаскивая из базы все метки
		//так как надо удалять эту метку с item
		List<Item> labelledItems = itemDao.listAllLabeled();
		for (Item item : labelledItems) {
			if (!existsLabelId.contains(item.getLabelId())) {
				Integer labelId = item.getLabelId(); 
				item.setLabelId(null);
				itemDao.save(item);
				labelDao.remove(labelId);
			}
		}
		
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				MainController.getMainController().updateFeedMenu();
			}
		});
		return true;
	}

	@Override
	public String getType() {
		return Commands.UPDATE_STARRED_ITEMS.toString();
	}
	
	@Override
	public Integer getPriority() {
		return 7;
	}

}
